<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      /* 
        复习
          高阶函数：如果一个函数的参数是函数，或返回值是函数，则这个函数是高阶函数。

          变量的作用域：全局作用域和局部作用域
              1. 函数内部可以使用全局作用域
              2. 函数外部不可以使用局部作用域
              3. 当函数执行完毕，本地作用域的局部变量销毁
      */
      /* 
        基本数据类型存放的是值，
        复杂数据类型存放的是值的地址。
        obj 重新赋值后，内存地址指向了貂蝉，
        而吕布这个对象，系统判断没有被引用(不再被使用)，就会下次GC时会被自动垃圾回收。
        结论: 没有被引用的数据，将会被GC。
      */
      // hero 内存地址: 0x001234  
      let hero = {
        name: "吕布",
        sex: true,
      };
      // hero 内存地址: 0x005678 
      hero = {
        name: "貂蝉",
        sex: false,
      };

      /* 
        内存栈模型：stack
          1. 先进后出
          2. 里面存储的是函数
          3. add 函数的过程，称为 入栈
          4. delete函数，函数执行完毕，出栈。
      */
      /* 
        内存的堆模型：heap
           主要用来存储变量
      */ 
      function fn1(){
        fn2();
        console.log('fn1');
      }

      function fn2(){
        fn3();
        console.log('fn2');
      }

      function fn3(){
        console.log('fn3');
      }

      fn1();
    </script>
  </body>
</html>
